/**
 *  Classe que representa um Projecto
 *  
 *  @file
 *  @version 1.0
 *
 *  
 *  @section Description
 *  Esta classe representa um Projecto.
 */

#import <Foundation/Foundation.h>
#import "Projects.h"
#import "DataContext.h"
#import "Problem.h"
#import "Action.h"
#import "Comment.h"
#import "State.h"
#import "History.h"
#import "Library.h"

@class DataContext;
@class Projects;
@class Problem;
@class Resource;
@class Comment;
@class Action;
@class State;
@class History;


/**
 Header para a classe Project. Esta classe tem o objectivo de encapsular o objecto de acesso a dados Projects. 
 Toda a logica que for necessária de implmentar no objecto Project, extra aquela que o gerador de código criou, deve ser feita nesta
 classe.
 */
@interface Project : NSObject{
	/**
	 Objecto de acesso a dados Projects. Este objecto tem toda a lógica a nível de acesso a dados para este objecto.
	 Tem também a capacidade de automaticamente criar os scripts SQL para efectuar pedidos a BD.
	 */
	Projects * projects;
	
	/**
	 Colection com os objectos Action relacionados com este Project
	 */
@private NSMutableArray *actionList;
	
	/**
	 Colection com os objectos Problem relacionados com este Project
	 */
@private NSMutableArray *problemList;
	
	/**
	 Colection com os objectos Comment relacionados com este Project
	 */
@private NSMutableArray *commentList;
	
	/**
	 Colection com os objectos Resource relacionados com este Project
	 */
@private NSMutableArray *resourceList;
	
	/**
	 Colection com os objectos History relacionados com este Project
	 */
@private NSMutableArray *historyList;
	
    /**
	 Colection com os objectos Risk relacionados com este Project
	 */
@private NSMutableArray *riskList;	
    
	/**
	 Project state
	 */
@private State *projectState;
	
	/**
	 Flag para marcar se o objecto foi alterado. 
	 */
@private bool changed;
	
	/**
	 Flag para marcar se o objecto nao existe na BD. 
	 */
@private bool isNew;
	
	
}

/**
 Objecto Projects associado
 */
@property (readwrite, assign)  Projects * projects;

/**
 Propriedade com as Action's associadas.
 */
@property (readwrite, assign)  NSMutableArray * actionList;

/**
 Propriedade com os Problem's associados.
 */
@property (readwrite, assign)  NSMutableArray * problemList;

/**
 Propriedade com os Comment's associados.
 */
@property (readwrite, assign)  NSMutableArray * commentList;

/**
 Propriedade com os Resource's associados.
 */
@property (readwrite, assign)  NSMutableArray * resourceList;

/**
 Colection com os objectos History relacionados com este Project.
 */
@property (readwrite, assign)  NSMutableArray * historyList;

/**
 Colection com os objectos Risk relacionados com este Project.
 */
@property (readwrite, assign)  NSMutableArray * riskList;

/**
 Project state
 */
@property (readwrite, assign) State *projectState;

/**
 Propriedade que indica se o objecto nao existe na BD.
 */
@property (readwrite)  bool  isNew;

/**
 Propriedade que indica se este objecto foi alterado desde que foi carregado da BD.
 */
@property (readwrite)  bool  changed;

/**
 @return Nome do projecto.
 */
- (NSString *) getProjectName;

	
	/**
	Constructor para um objecto Novo.
	@return Instancia.
	*/
- (id) initForNew;

	/**
	 Constructor com base num objecto Projects.
	 @param pprojects Projects. 
	 @return Instancia.
	 */

/**
 Constructor com base num objecto Projects.
 @param pprojects Projects. 
 @return Instancia.
 */

- (id) initWithProjects : (Projects *) pprojects;


/**
 Metodo para carregar o status do projeto.
 **/
- (void) loadStatus;

/**
 Metodo para carregar as Action's associadas ao projecto.
 */	
- (void) loadActions;

/**
 Metodo para carregar os Problem's associadas ao projecto.
 */	
- (void) loadProblems;

/**
 Metodo para carregar os Comment's associadas ao projecto.
 */	
- (void) loadComments;

/**
 Metodo para carregar os Resource's associadas ao projecto.
 */
- (void) loadResources;

/**
 Metodo para carregar os State's associados ao projecto.
 */
- (void) loadStates;

/**
 Metodo para carregar o historico associado ao projecto.
 */
- (void) loadHistory;

/**
 Metodo para carregar o risco associado ao projecto.
 */
- (void) loadRisks;

/**
 Metodo para descarregar as Action's associadas ao projecto.
 */
- (void) unloadActions;

/**
 Metodo para descarregar os Problem's associados ao projecto.
 */
- (void) unloadProblems;

/**
 Metodo para descarregar os Comment's associados ao projecto.
 */
- (void) unloadComments;

/**
 Metodo para descarregar os Resource's associados ao projecto.
 */
- (void) unloadResources;

/**
 Metodo para descarregar os Risk's associados ao projecto.
 */
- (void) unloadRisks;

/**
 Metodo para associar uma nova Action ao projecto.
 @param action Action a associar.
 */
- (void) insertNewAction : (Action *) action;

/**
 Metodo para associar um novo Problem ao projecto.
 @param problem Problem a associar
 */
- (void) insertNewProblem : (Problem *) problem;

/**
 Metodo para associar um novo Comment ao projecto.
 @param comment Comment a associar.
 */
- (void) insertNewComment : (Comment *) comment;

/**
 Metodo para devolver a descriçao do Project.
 @return Descriçao do projecto.
 */
- (NSString *) getProjectDescription;

/**
 Metodo para devolver o estado do Project.
 @return Estado do projecto.
 */
- (NSString *) getProjectStatus;

/**
 Metodo para devolver o identificador do Project.
 @return Identificador do projecto.
 */
- (int) getProjectId; 

/**
 @return O tempo em segundos desde Janeiro de 1970 até ao valor de StartTime. 
 */
- (double) getProjectStartTime;

/**
 @return O tempo em segundos desde Janeiro de 1970 até ao valor de FinishTime. 
 */
- (double) getProjectFinishTime;

/**
 @return O tempo em segundos desde Janeiro de 1970 até ao valor de StatusTime. 
 */
- (double) getProjectStatusTime;


	/**
	 @return A script de insert para inserir este objecto na BD.
	 **/
- (NSString *) getInsertString;

	/**
	@return A script de insert para actualizar este objecto na BD.
	**/
- (NSString *) getUpdateString;


	/**
	param O tempo em segundos desde Janeiro de 1970. 
	 */

/**
 param O tempo em segundos desde Janeiro de 1970. 
 */

- (void) setProjectStartTime : (double) dateTime;

/**
 param O tempo em segundos desde Janeiro de 1970. 
 */
- (void) setProjectFinishTime : (double) dateTime;

/**
 param O tempo em segundos desde Janeiro de 1970. 
 */
- (void) setProjectStatusTime : (double) dateTime;

/**
 param O novo nome do projecto.
 */
- (void) setProjectName : (NSString *) projectName;

/**
 param A nova descricao do projecto.
 */
- (void) setProjectDescription : (NSString *) projectDescription;

/**
 return O selctor parar invocar o metodo de alteracao da data. 
 */
- (SEL) getSetProjectStartTimeSelector;

/**
 return O selctor parar invocar o metodo de alteracao da data. 
 */
- (SEL) getSetProjectFinishTimeSelector;

/**
 return O selctor parar invocar o metodo de alteracao da data. 
 */
- (SEL) getSetProjectStatusTimeSelector;


@end
